Amazon EventBridgeのCronを使用してAWS Lambdaを実行していますが、設定時刻と起動時刻に誤差があるのはなぜか教えてください
困っていること
ルール名「samplecron」のイベントスケジュールにおいて、Cron 式 「20/30 * * * ? *」の設定をしています。
上記設定のCron式のとおり、毎時20分00秒にトリガーさせています。
ところが、CloudWatchのログイベントを確認したところ、AWS Lambdaが起動しているのは20分41秒となってます。 この41秒の誤差があるのはなぜでしょうか、教えてください。
どう対応すればいいの?
結論から言うと、Amazon EventBridgeのCron式の精度は分単位です。
なので、Amazon EventBridgeにおいて、最大で59秒の遅延が発生するものであり、遅延の秒数も一定ではないものとなります。
以下、公式ドキュメントにも同様に記載されています。
CloudWatch Events は、スケジュール式で秒レベルの精度を提供しません。Cron 式を使用した最小の解決は分です。CloudWatch Events とターゲットサービスが持つ分散性の特質により、スケジュールされたルールがトリガーされてから、ターゲットサービスがターゲットリソースの実行を優先するまでの遅延は、数秒となる可能性があります。スケジュールされたルールは、その分のうちにトリガーされますが、正確に 0 秒にトリガーされません。
以上より、Cronが通常使われるような定期的な処理では、誤差があっても問題がない前提のもとでCron設計するのがベストプラクティスとなります。
補足
なお、厳密な起動時間にする場合はCron以外のデーモンを作成するか、Cronで1分前に起動されてから、想定の時間まで待機させるなどの方法は考えられます。